GDB 是 GNU Debugger 的縮寫,它是一個功能強大的 command line debug 工具,支援多種程式語言如 C、C++、Fortran 等等。當我們在進行開發時,如果程式在執行過程中發生 segmentation fault 或其他錯誤,GDB 可以幫助我們追蹤程式 crash 的原因。我們可以透過設置中斷點、檢查變數內容等,來針對特定問題進行 debug
原生的 GDB 有時候可能顯得過於簡單,缺少一些便利的視覺化工具或記憶體分析功能。因此,許多使用者會安裝外掛來補強 GDB 的功能,像是 pwndbg 或 peda 等外掛,可以讓我們更容易地看到 stack、register 等資訊,從而提高 debug 效率
執行程式並設定中斷點:
run 或 r 來執行程式,通常會先設定中斷點(break)在程式的某一個位置,例如 main 函式,這樣程式會在到達該點時停止執行,方便我們進行檢查。b main 在 main 函式處設置中斷點。踩到中斷點後要繼續執行程式:
continue 或 c 來繼續執行程式。觀察 register:
info 指令查看目前的 register 狀態、函式列表等資訊。例如,使用 info registers 來查看目前的 register 內容。x 指令可以檢查具體的記憶體位址,通過格式化選項來調整輸出,例如 x/2gx $rax 顯示從寄存器 rax 開始的兩個 giant word。反組譯執行的程式:
disassemble 指令可以查看程式的反組譯結果,幫助分析程式的指令。下一步指令:
ni 直接執行到下一行指令(不進入函式)。si 如果遇到函式,則會進入函式內部。結束函式:
finish 讓程式執行到目前函式的結束,並返回呼叫者。顯示暫存器、函式、中斷點資訊:
info 來顯示各種資訊,如 info functions 列出所有函式,info breakpoints 顯示目前的中斷點。列出記憶體資訊:
x $[register] 或 x [address] 可以查看指定位址的記憶體內容。x/<fmt> <address>,其中:
fmt = count + size + format
x/2gx $rax
刪除中斷點:
delete、del 或 d 可以刪除中斷點。若要刪除特定中斷點,使用 delete [breakpoint id]。直接讓指令跳轉到指定位址:
jump location 讓程式執行跳轉到指定位址。查看指令:
help 可以查看 GDB 的指令說明。在 PWN 競賽中,我們經常會使用一些增強 GDB 的外掛來幫助我們快速分析程式的記憶體佈局和進行漏洞利用。以下是幾個常見的外掛指令:
查看 libc base:
libc 指令來查看 libc 的 base address,這在某些攻擊技巧中非常重要,因為我們需要精確定位 libc 函式的位址。查看 PIE base:
pie 指令來顯示程式的 PIE (Position Independent Executable) base address。查看 heap base:
heap 指令來顯示 heap 的 base address查看 GOT 表:
got 指令來查看 GOT 表,便於我們瞭解動態函式載入時的位址。查看 PLT 表:
plt 指令來查看 PLT 表,分析函式載入過程。查看 heap 資訊:
heapinfo 來查看 heap 的詳細資訊查看偏移量:
off [libc function] 指令來查看 libc 函式的偏移量,便於計算攻擊所需的位址偏移